/************************************************/
/*    Auteur    : Yoann NICOD                   */
/*    Programme : Atomic Bomberman Origins      */
/*    Fichier   : gui.h                         */
/*    Date      : 16/01/2013                    */
/************************************************/

#ifndef GUI_H
#define GUI_H

#include <list>
#include <SFML\Graphics.hpp>

using namespace std;
using namespace sf;

class EvenementGUI
{
public:

	enum TypeEvenementGUI
	{
		AUCUN,
		BP_AvancerBarreProgression
	};

	EvenementGUI();
	~EvenementGUI();

	TypeEvenementGUI m_TypeEvenementGUI;
	void *m_pParam;
};

class ObjetGUI
{
public:
	ObjetGUI();
	~ObjetGUI();

	int ID;
	unsigned int m_zindex;
	unsigned int m_PositionXDansLaGUI;
	unsigned int m_PositionYDansLaGUI;

	virtual void EffectuerRendu(RenderWindow *pFenetreRendu, unsigned int ShiftX, unsigned int ShiftY) = 0;
	virtual void NotifierEvenement(EvenementGUI &MonEvenement) {}
	bool operator < (const ObjetGUI& ObjetGUI2)	{ return m_zindex >= ObjetGUI2.m_zindex; }
};

class ArriereGUI : public ObjetGUI
{
public:
	ArriereGUI(unsigned int Largeur, unsigned int Hauteur);
	~ArriereGUI();

	void EffectuerRendu(RenderWindow *pFenetreRendu, unsigned int ShiftX, unsigned int ShiftY);

private:
	unsigned int m_Largeur;
	unsigned int m_Hauteur;
	Shape m_ShapeArriereGUI;
};

class ZoneTexte : public ObjetGUI
{
public:
	ZoneTexte(unsigned int Largeur, unsigned int Hauteur);
	~ZoneTexte();

	void EffectuerRendu(RenderWindow *pFenetreRendu, unsigned int ShiftX, unsigned int ShiftY);
	void SetTexte(char *pTexte);
	void SetTaillePolice(float Taille);
	void SetCouleur(Color Couleur);

private:
	unsigned int m_Largeur;
	unsigned int m_Hauteur;
	String m_Texte;
	Shape m_ShapeArriereTexte;
};

class GUI
{
public:
	static Color CouleurTexteDefaut;
	static Color CouleurArriereTexteDefaut;
	static Color CouleurArrierePlanGUIDefaut;
	static Color CouleurBordureGUIDefaut;
	
	GUI(RenderWindow *pFenetreRendu, unsigned int Largeur, unsigned int Hauteur);
	~GUI();
	void EffectuerRendu();
	int AjouterObjetGUI(ObjetGUI *pObjet);
	void SetPositionXGlobale(unsigned int PositionX);
	void SetPositionYGlobale(unsigned int PositionY);

private:
	list<ObjetGUI*> m_ListeObjetsGUI;
	unsigned int m_Largeur;
	unsigned int m_Hauteur;
	unsigned int m_PositionXGlobale;
	unsigned int m_PositionYGlobale;
	RenderWindow *m_pFenetreRendu;
	ArriereGUI m_ArriereGUI;

	int RechercherIDDisponible();
};

#endif